import inquirer from 'inquirer'
import { error, highlight, info } from '@/utils'
import { JenkinsService } from '@/api'
// import Conf from 'conf';
//
// const config = new Conf({
//   schema: {},
//   configName: 'w-jenkins',
// });

// import lastArrayEach from 'xe-utils/lastArrayEach.js';
//
// const TIMEOUT = 5000;
//
// const store = Store.getInstance({
//   cwd: process.cwd(),
//   configName: 'jz.jenkins',
// });
//
// let commandOptions = {};
// const queueItemNumberList = [];

export default async (options: any) => {
  if (options.create) {
    createConfig()
  } else {
    // buildJobByConfig();
  }
}

function createConfig() {
  inquirer
    .prompt([
      {
        type: 'rawlist',
        name: 'jobName',
        message: `${info('选择一个Jenkins Job')}}`,
        choices: getJenkinsJobChoices,
        // pageSize: 20,
      },
      {
        type: 'rawlist',
        name: 'parameter',
        message: `${info('选择一个参数')}}`,
        choices: getJenkinsParameterChoices,
      },
      {
        type: 'rawlist',
        name: 'parameterValue',
        message: `${info('选择一个参数值')})}`,
        choices(answers) {
          return answers.parameter.parameterValueChoices
        },
      },
    ])
    .then((answers) => {
      const { jobName, parameter, parameterValue } = answers
      // config.set(jobName, {
      //   [parameter]: parameterValue,
      // });
      // store.addArrItem('builds', {
      //   jobName,
      //   parameterName: parameter.name,
      //   parameterValue,
      // });
    })
}

async function getJenkinsJobChoices() {
  const jobs = await JenkinsService.getJobs()
  return jobs.map((job: any) => ({
    name: job.name,
    value: job.name,
  }))
}

async function getJenkinsParameterChoices(answers: any) {
  const jobName = answers.jobName
  const job = await JenkinsService.getJob(jobName)
  const parameters = job.actions.find(
    (action: any) =>
      action._class === 'hudson.model.ParametersDefinitionProperty',
  ).parameterDefinitions
  return parameters.map(({ allValueItems, name }: any) => ({
    name: name,
    value: {
      name: name,
      parameterValueChoices: allValueItems.values.filter((item: any) =>
        item.name.includes('rc-'),
      ),
    },
  }))
}

// function buildJobByConfig() {
//   inquirer
//     .prompt([
//       {
//         type: 'checkbox',
//         name: 'builds',
//         pageSize: 20,
//         message: `${info('选择一个或多个构建配置')}`,
//         choices: getBuildChoices,
//       },
//     ])
//     .then(async (answers) => {
//       const { builds } = answers;
//       if (builds.length === 0) {
//         log.fail('已取消');
//         process.exit(1);
//       }
//       if (commandOptions.risky) {
//         triggerBuild(builds);
//         return;
//       }
//       exec('git branch --show-current', (err, stdout) => {
//         if (err) {
//           log.fail('获取当前分支名称失败');
//         }
//
//         const currentBranchName = getStdoutString(stdout);
//         if (!currentBranchName) {
//           log.fail('未知分支状态');
//         }
//
//         log.succeedWithTag('当前分支', currentBranchName);
//
//         let compareBranchName = currentBranchName;
//
//         const branchInfo = gStore.getMapItem(
//           BRANCH_INFO_MAP,
//           currentBranchName,
//         );
//         if (branchInfo) {
//           const upstreamBranchName = branchInfo.sprintName;
//           log.succeedWithTag('上游分支', upstreamBranchName);
//           compareBranchName = upstreamBranchName;
//         }
//
//         const riskyBuildArr = [];
//         const riskFreeBuildArr = builds.filter((item) => {
//           if (item.parameterValue.includes(compareBranchName)) {
//             return true;
//           } else {
//             riskyBuildArr.push(item);
//             return false;
//           }
//         });
//         if (riskyBuildArr.length === 0) {
//           triggerBuild(riskFreeBuildArr);
//         } else {
//           handleRiskyBuild(riskFreeBuildArr, riskyBuildArr, compareBranchName);
//         }
//       });
//     });
// }
//
// async function getBuildChoices() {
//   const builds = store.get('builds');
//   if (!builds) {
//     log.fail('请先创建配置');
//     process.exit(1);
//   }
//   const choices = [];
//   lastArrayEach(builds, (build, index) => {
//     const { jobName, parameterName, parameterValue } = build;
//     choices.push({
//       name: `[${jobName}] ${parameterName} ${parameterValue}`,
//       value: build,
//     });
//   });
//   if (choices.length === 0) {
//     log.fail('请先创建配置');
//     process.exit(1);
//   }
//   choices.forEach((item) => {
//     const jobName = item.value.jobName;
//     if (
//       jobName.includes('stage') ||
//       jobName.includes('dev') ||
//       jobName.includes('qa')
//     ) {
//       item.checked = true;
//     }
//   });
//
//   // choices jobName字段, 先按照前缀排序, 再按照 dev qa uat prod 结尾 排序
//
//   const order = {
//     dev: 1,
//     qa: 2,
//     uat: 3,
//     prod: 4,
//   };
//
//   choices.sort((a, b) => {
//     const aJobName = a.value.jobName;
//     const bJobName = b.value.jobName;
//     const aPrefix = aJobName.split('-')[0];
//     const bPrefix = bJobName.split('-')[0];
//     if (aPrefix === bPrefix) {
//       const aSuffix = aJobName.split('-').pop();
//       const bSuffix = bJobName.split('-').pop();
//       return order[aSuffix] - order[bSuffix];
//     } else {
//       return aPrefix.localeCompare(bPrefix);
//     }
//   });
//   return choices;
// }

// function handleRiskyBuild(riskFreeBuildArr, riskyBuildArr, compareBranchName) {
//   log.warn(
//     '以下构建配置可能存在风险, 当前分支与构建配置的参数值不匹配, 请检查 jz.jenkins.json 配置文件',
//   );
//   inquirer
//     .prompt({
//       type: 'checkbox',
//       name: 'builds',
//       pageSize: 20,
//       message: `${chalk.red('确认后继续执行构建, 或 Ctrl+C 退出')}`,
//       choices: riskyBuildArr.map((item) => ({
//         name: `[${item.jobName}] ${item.parameterName} ${item.parameterValue}, ${chalk.red(
//           `当前迭代 ${compareBranchName}`,
//         )}`,
//         value: item,
//         checked: true,
//       })),
//     })
//     .then((answers) => {
//       const { builds } = answers;
//       triggerBuild(riskFreeBuildArr.concat(builds));
//     });
// }
//
// async function triggerBuild(builds) {
//   for (let index = 0; index < builds.length; index++) {
//     const { jobName, parameterName, parameterValue } = builds[index];
//     const queueItemNumber = await buildJob(jobName, {
//       [parameterName]: parameterValue,
//     });
//     queueItemNumberList.push(queueItemNumber);
//     log.succeed(
//       `已触发构建 ${index + 1}: [${jobName}] ${parameterName} ${parameterValue}`,
//     );
//   }
//   setTimeout(() => {
//     checkBuildResult();
//   }, TIMEOUT);
// }
//
// function checkBuildItemResultRetry(queueItemNumber, timeout = TIMEOUT) {
//   setTimeout(() => {
//     checkBuildItemResult(queueItemNumber);
//   }, timeout);
// }
//
// function checkBuildItemResult(queueItemNumber) {
//   getQueueItem(queueItemNumber)
//     .then((res) => {
//       const { executable, task } = res;
//       if (executable) {
//         getBuild(task.name, executable.number).then((res) => {
//           const { result, url, displayName, estimatedDuration, timestamp } =
//             res;
//           log.info(
//             `构建中... ${task.name} ${displayName}, 预估剩余时间: ${msToMmss(
//               estimatedDuration - (Date.now() - timestamp),
//             )}`,
//           );
//           if (result) {
//             if (result === 'SUCCESS') {
//               log.succeedWithTag('构建状态', `构建成功: ${url}`);
//             } else if (result === 'ABORTED') {
//               log.warnWithTag('构建状态: ', `已取消: ${url}`);
//             } else if (result === 'FAILURE') {
//               log.failWithTag('构建状态: ', `失败: ${url}`);
//             } else if (result === 'UNSTABLE') {
//               log.warnWithTag('构建状态: ', `不稳定的构建: ${url}`);
//             } else if (result === 'NOT_BUILT') {
//               log.warnWithTag('构建状态: ', `未执行: ${url}`);
//             } else if (result === 'RUNNING') {
//               log.infoWithTag('构建状态: ', `构建中: ${url}`);
//               checkBuildItemResultRetry(queueItemNumber);
//             } else if (result === 'QUEUED') {
//               log.infoWithTag('构建状态: ', `排队中: ${url}`);
//               checkBuildItemResultRetry(queueItemNumber);
//             } else {
//               log.failWithTag('构建状态: ', `未知原因失败: ${url}`, result);
//             }
//             queueItemNumberList.splice(
//               queueItemNumberList.indexOf(queueItemNumber),
//               1,
//             );
//           } else {
//             checkBuildItemResultRetry(queueItemNumber);
//           }
//         });
//       } else {
//         log.debug(`等待构建中... ${task.name}`);
//         checkBuildItemResultRetry(queueItemNumber);
//       }
//     })
//     .catch((err) => {
//       log.fail(err);
//     });
// }
//
// function checkBuildResult() {
//   if (queueItemNumberList.length === 0) {
//     return;
//   }
//   getQueueList().then((res) => {
//     log.infoWithTag(
//       '当前队列',
//       res.map((item, index) => `\n${index + 1}. ${item.task.name}`).join(''),
//     );
//   });
//   queueItemNumberList.forEach((queueItemNumber, index) => {
//     checkBuildItemResultRetry(queueItemNumber, (index * TIMEOUT) / 2);
//   });
// }
//
